package com.bird.thread.base.background;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author: bird
 * @Data: 2021/7/5 10:49
 * @description: 验证： a++操作多线程操作访问,导致结果错误。
 */
public class MultiThreadsError0 implements Runnable {

     private Object lock = new Object();

  //  static int index = 0;
    static  AtomicInteger index=new AtomicInteger();

    public static void main(String[] args) throws InterruptedException {
        MultiThreadsError0 runnable = new MultiThreadsError0();
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();
        System.out.println("表面上的结果："+ index);
    }


    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            index.incrementAndGet();
           // index++;
        }
    }

    /*结论：index结果错误
     * 原因: 多线程访问一个方法 并没有原子性操作 导致结果错误。
     * index++操作 看起来是一个操作实际上却是3步操作。
     *  第一步：先从内存中拿到index值。
     *  第二步：再给index进行加1操作。
     *  第三步：最后将index的值写入到内存。
     *
     * 由于这个三步不是原子操作 所以导致多线程访问 造成数据错误的问题。
     * 解决方案：加synchronized关键字或者使用原子类AtomicInteger进行操作
     *  1：synchronized 修饰的代码块可以保证同一时刻 只能有一个线程执行。
     *  2: synchronized 修饰的变量可以保证 具有可见性。
     *  3: synchronized 的括号内 如果没有指定的锁对象 那么当前的类对象就是 synchronized的锁对象。
     */
}
